//
//  FMDBDataAccess.m
//  iTeVe
//
//  Created by Pedro Gonzalez on 01/02/14.
//  Copyright (c) 2014 SISI Software. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "FMDBDataAccess.h"

@interface FMDBDataAccess()
    
@end

@implementation FMDBDataAccess




- (int)databaseSchemaVersion {
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
   FMResultSet *resultSet = [db executeQuery:@"SELECT sql FROM SQLITE_MASTER WHERE NAME = 'version' "];
    if (!resultSet.next){
        [self creoTabellaVersion];
    }
    
    
    resultSet = [db executeQuery:@"SELECT version FROM version"];
    int version = 0;
    if ([resultSet next]) {
        version = [resultSet intForColumnIndex:0];
    }
    
    [db close];
    
    return version;
}

- (BOOL)setDatabaseSchemaVersion:(int)version {
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:[NSString stringWithFormat:@"UPDATE version SET version = '%d' ", version]];
    
    [db close];
    
    return success;
}



-(void)creoTabellaVersion {
 
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:[NSString stringWithFormat:@"create table if not exists version (version NUMBER) ;"]];
    
    if (success){
        success = [db executeUpdate:[NSString stringWithFormat:@"INSERT INTO version (version) values(1) ;"]];
    }
    
    [db close];
    
}


-(void)aggiornoTabelle {
    
    int versione = [self databaseSchemaVersion];
    
    if (versione<=1) {


        FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
        
        [db open];
        
        BOOL success = NO;
        
        
        
//        success = [db executeUpdate:[NSString stringWithFormat:    @"CREATE  TABLE agenti (id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , codage TEXT NOT NULL , descrizione TEXT, indirizzo text, cap text, citta text, nazione text, telefono text, cellulare text, partitaiva text, codicefiscale text, provincia text, email text, utente text, password text, sitoweb text) ;"]];

//        success = [db executeUpdate:[NSString stringWithFormat:@"DELETE FROM tipimov where id>6"]];
//        success = [db executeUpdate:@"ALTER TABLE tipimov ADD COLUMN controparte INTEGER NOT NULL  DEFAULT 1 ;"];
        
//        BOOL success = [db executeUpdate:[NSString stringWithFormat:@"DELETE FROM listiniart"]];
//        BOOL success = [db executeUpdate:[NSString stringWithFormat:@"UPDATE testa SET idcliente = 1 WHERE idcliente is null ;"]];
//        BOOL success = [db executeUpdate:[NSString stringWithFormat:@"ALTER TABLE articoli ADD COLUMN unmisura TEXT ;"]];

        if (success){
            NSLog( success? @"Ok update/create database 2" : @"Error update/create database 2" );
        }
        
        [db close];



    }
    
    if (versione<=2){
        
    }
    
    if (versione<=3){
        
    }
    
    
    [self setDatabaseSchemaVersion:1];
    
}



// ALIQUOTE IVA
-(NSMutableArray *) getAliquote;
{
    NSMutableArray *aliquote = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    NSString *testoQuery = [NSString stringWithFormat:@"SELECT * FROM aliquote ORDER BY UPPER(descrizione)"];
    
    FMResultSet *results = [db executeQuery:testoQuery];
    
    while([results next])
    {
        
        Aliquota *aliquota = [[Aliquota alloc] init];
        
        aliquota.id = [results intForColumn:@"id"];
        aliquota.codali = [results stringForColumn:@"codali"];
        aliquota.descrizione = [results stringForColumn:@"descrizione"];
        aliquota.percentuale = [NSNumber numberWithDouble:[results doubleForColumn:@"percentuale"]];
        
        [aliquote addObject:aliquota];
        
    }
    
    [db close];
    
    return aliquote;
    
}

-(Aliquota *) getAliquotaxId:(int )id;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM aliquote where id=? ", [NSNumber numberWithInt:id]];
    
    Aliquota *aliquota = [[Aliquota alloc] init];
    while([results next])
    {
        aliquota.id = [results intForColumn:@"id"];
        aliquota.codali = [results stringForColumn:@"codali"];
        aliquota.descrizione = [results stringForColumn:@"descrizione"];
        aliquota.percentuale = [NSNumber numberWithDouble:[results doubleForColumn:@"percentuale"]];
        break;
    }
    
    [db close];
    
    return aliquota;
    
}

-(Aliquota *) getAliquotaxCodice:(NSString *)codice;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM aliquote where codali=? ", codice];
    
    Aliquota *aliquota = [[Aliquota alloc] init];
    while([results next])
    {
        aliquota.id = [results intForColumn:@"id"];
        aliquota.codali = [results stringForColumn:@"codali"];
        aliquota.descrizione = [results stringForColumn:@"descrizione"];
        aliquota.percentuale = [NSNumber numberWithDouble:[results doubleForColumn:@"percentuale"]];
        break;
    }
    
    [db close];
    
    return aliquota;
    
}


-(BOOL) updateAliquota:(Aliquota *)aliquota
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE aliquote SET codali = ?, descrizione = ?, percentuale = ? where id = ? ;", aliquota.codali, aliquota.descrizione, aliquota.percentuale, [NSNumber numberWithInt:aliquota.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertAliquota:(Aliquota *)aliquota
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO aliquote (codali, descrizione, percentuale) VALUES (?,?,?);",
                    aliquota.codali, aliquota.descrizione, aliquota.percentuale];
    
    [db close];
    
    return success;
}

-(BOOL) removeAliquota:(Aliquota *)aliquota
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM aliquote where id = ? ;", [NSNumber numberWithInt:aliquota.id]];
    
    [db close];
    
    return success;
}



// ARTICOLI

-(NSMutableArray *) getArticoli:(NSString *)filtro;
{
    NSMutableArray *articoli = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    NSString *testoFiltro = @"";
    if (filtro.length!=0){
        testoFiltro = [NSString stringWithFormat:@" WHERE codart LIKE '%%%@%%' OR descrizione LIKE '%%%@%%'  ", filtro, filtro];
    }
    
    
    NSString *testoQuery = [NSString stringWithFormat:@"SELECT * FROM articoli %@ ORDER BY UPPER(descrizione)", testoFiltro];
    
    FMResultSet *results = [db executeQuery:testoQuery];
    
    while([results next])
    {
        Articolo *articolo = [[Articolo alloc] init];
        
        articolo.id = [results intForColumn:@"id"];
        articolo.codart = [results stringForColumn:@"codart"];
        articolo.descrizione = [results stringForColumn:@"descrizione"];
        articolo.codali = [results stringForColumn:@"codali"];
        articolo.costo = [NSNumber numberWithDouble:[results doubleForColumn:@"costo"]];
        articolo.unmisura = [results stringForColumn:@"unmisura"];
        [articoli addObject:articolo];
        
    }
    
    [db close];
    
    return articoli;
    
}

-(Articolo *) getArticoloxId:(int )id;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM articoli where id=? ", [NSNumber numberWithInt:id]];
    
    Articolo *articolo = [[Articolo alloc] init];
    while([results next])
    {
        articolo.id = [results intForColumn:@"id"];
        articolo.codart = [results stringForColumn:@"codart"];
        articolo.descrizione = [results stringForColumn:@"descrizione"];
        articolo.codali = [results stringForColumn:@"codali"];
        articolo.costo = [NSNumber numberWithDouble:[results doubleForColumn:@"costo"]];
        articolo.unmisura = [results stringForColumn:@"unmisura"];
        break;
    }
    
    [db close];
    
    return articolo;
    
}

-(Articolo *) getArticoloxCodice:(NSString *)codart;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM articoli where codart=? ", codart];
    
    Articolo *articolo = [[Articolo alloc] init];
    while([results next])
    {
        articolo.id = [results intForColumn:@"id"];
        articolo.codart = [results stringForColumn:@"codart"];
        articolo.descrizione = [results stringForColumn:@"descrizione"];
        articolo.codali = [results stringForColumn:@"codali"];
        articolo.costo = [NSNumber numberWithDouble:[results doubleForColumn:@"costo"]];
        articolo.unmisura = [results stringForColumn:@"unmisura"];
        break;
    }
    
    [db close];
    
    return articolo;
    
}


-(BOOL) updateArticolo:(Articolo *)articolo
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE articoli SET codart = ?, descrizione = ?, codali = ?, costo = ?, unmisura = ? where id = ? ;", articolo.codart, articolo.descrizione, articolo.codali, articolo.costo, articolo.unmisura, [NSNumber numberWithInt:articolo.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertArticolo:(Articolo *)articolo
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO articoli (codart, descrizione, codali, costo, unmisura) VALUES (?,?,?,?,?);",
                    articolo.codart, articolo.descrizione, articolo.codali, articolo.costo, articolo.unmisura];
    
    [db close];
    
    return success;
}

-(BOOL) removeArticolo:(Articolo *)articolo
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM articolo where id = ? ;", [NSNumber numberWithInt:articolo.id]];
    
    [db close];
    
    return success;
}

// LISTINI DI VENDITA ARTICOLO
-(NSMutableArray *) getListiniVenditaArticolo:(Articolo *)articolo;
{
    NSMutableArray *listiniarticolo = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
        
    FMResultSet *results = [db executeQuery:@"SELECT * FROM listiniart WHERE listiniart.codart=? ORDER BY UPPER(codlis)", articolo.codart];
    
    while([results next])
    {
        ListinoArticolo *listinoarticolo = [[ListinoArticolo alloc] init];
        listinoarticolo.id = [results intForColumn:@"id"];
        listinoarticolo.codart = [results stringForColumn:@"codart"];
        listinoarticolo.codlis = [results stringForColumn:@"codlis"];
        listinoarticolo.prezzo = [NSNumber numberWithDouble:[results doubleForColumn:@"prezzo"]];
        [listiniarticolo addObject:listinoarticolo];
    }
    
    [db close];
    
    return listiniarticolo;
    
}

-(ListinoArticolo *) getListinoArticolo:(Articolo *)articolo :(Listino*)listino;
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM listiniart WHERE listiniart.codart=? AND listiniart.codlis=? ", articolo.codart, listino.codlis];
    
    ListinoArticolo *listinoarticolo = [[ListinoArticolo alloc] init];
    while([results next])
    {
        listinoarticolo.id = [results intForColumn:@"id"];
        listinoarticolo.codart = [results stringForColumn:@"codart"];
        listinoarticolo.codlis = [results stringForColumn:@"codlis"];
        listinoarticolo.prezzo = [NSNumber numberWithDouble:[results doubleForColumn:@"prezzo" ]];
        break;
    }
    
    [db close];
    
    return listinoarticolo;
    
}

-(ListinoArticolo *) getListinoArticoloxCodice:(NSString *)codlis codiceArticolo:(NSString *)codart;
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM listiniart where codlis=? AND codart=? ", codlis, codart];
    
    ListinoArticolo *listino = [[ListinoArticolo alloc] init];
    while([results next])
    {
        listino.id = [results intForColumn:@"id"];
        listino.codlis = [results stringForColumn:@"codlis"];
        listino.codart = [results stringForColumn:@"codart"];
        listino.prezzo = [NSNumber numberWithDouble:[results doubleForColumn:@"prezzo" ]];
        break;
    }
    
    [db close];
    
    return listino;
}

-(BOOL) updateListinoArticolo:(ListinoArticolo *)listino
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE listiniart SET codlis = ?, codart = ?, prezzo = ? where id = ? ;", listino.codlis, listino.codart, listino.prezzo, [NSNumber numberWithInt:listino.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertListinoArticolo:(ListinoArticolo *)listino;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO listiniart (codlis, codart, prezzo) VALUES (?,?,?);",
                    listino.codlis, listino.codart, listino.prezzo];
    
    [db close];
    
    return success;
}

-(BOOL) removeListinoArticolo:(Listino *)listino
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM listiniart where id = ? ;", [NSNumber numberWithInt:listino.id]];
    
    [db close];
    
    return success;
}



// LISTINI
-(NSMutableArray *) getListini;
{
    NSMutableArray *listini = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM listini ORDER BY UPPER(codlis)"];
    
    while([results next])
    {
        Listino *listino = [[Listino alloc] init];
        listino.id = [results intForColumn:@"id"];
        listino.codlis = [results stringForColumn:@"codlis"];
        listino.descrizione = [results stringForColumn:@"descrizione"];
        listino.ivato = [results boolForColumn:@"ivato"];
        [listini addObject:listino];
    }
    
    [db close];
    
    return listini;
    
}

-(Listino *) getListinoxCodice:(NSString *)codlis;
{
 
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM listini where codlis=? ", codlis];
    
    Listino *listino = [[Listino alloc] init];
    while([results next])
    {
        listino.id = [results intForColumn:@"id"];
        listino.codlis = [results stringForColumn:@"codlis"];
        listino.descrizione = [results stringForColumn:@"descrizione"];
        listino.ivato = [results boolForColumn:@"ivato"];
        break;
    }
    
    [db close];
    
    return listino;
}

-(BOOL) updateListino:(Listino *)listino
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE listini SET codlis = ?, descrizione = ?, ivato = ? where id = ? ;", listino.codlis, listino.descrizione, [NSNumber numberWithBool:listino.ivato], [NSNumber numberWithInt:listino.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertListino:(Listino *)listino;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO listini (codlis, descrizione, ivato) VALUES (?,?,?);",
                    listino.codlis, listino.descrizione, [NSNumber numberWithBool:listino.ivato]];
    
    [db close];
    
    return success;
}

-(BOOL) removeListino:(Listino *)listino
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM listini where id = ? ;", [NSNumber numberWithInt:listino.id]];
    
    [db close];
    
    return success;
}


// DEPOSITI
-(NSMutableArray *) getDepositi;
{
    NSMutableArray *depositi = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM depositi ORDER BY coddep"];
    
    while([results next])
    {
        Deposito *deposito = [[Deposito alloc] init];
        deposito.id = [results intForColumn:@"id"];
        deposito.coddep = [results stringForColumn:@"coddep"];
        deposito.descrizione = [results stringForColumn:@"descrizione"];
        [depositi addObject:deposito];
    }
    
    [db close];
    
    return depositi;
    
}

-(Deposito *) getDepositoxCodice:(NSString *)coddep
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM depositi where coddep=? ", coddep];
    
    Deposito *deposito = [[Deposito alloc] init];
    while([results next])
    {
        deposito.id = [results intForColumn:@"id"];
        deposito.coddep = [results stringForColumn:@"coddep"];
        deposito.descrizione = [results stringForColumn:@"descrizione"];
        break;
    }
    
    [db close];
    
    return deposito;
}

-(BOOL) updateDeposito:(Deposito *)deposito
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE depositi SET coddep = ?, descrizione = ? where id = ? ;", deposito.coddep, deposito.descrizione, [NSNumber numberWithInt:deposito.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertDeposito:(Deposito *)deposito
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO depositi (coddep, descrizione) VALUES (?,?);",
                    deposito.coddep, deposito.descrizione];
    
    [db close];
    
    return success;
}

-(BOOL) removeDeposito:(Deposito *)deposito
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM depositi where id = ? ;", [NSNumber numberWithInt:deposito.id]];
    
    [db close];
    
    return success;
}


// AGENTI
-(NSMutableArray *) getAgenti;
{
    NSMutableArray *agenti = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM agenti ORDER BY codage"];
    
    while([results next])
    {
        Agente *agente = [[Agente alloc] init];
        agente.id = [results intForColumn:@"id"];
        agente.codage = [results stringForColumn:@"codage"];
        agente.descrizione = [results stringForColumn:@"descrizione"];
        agente.indirizzo = [results stringForColumn:@"indirizzo"];
        agente.cap = [results stringForColumn:@"cap"];
        agente.citta = [results stringForColumn:@"citta"];
        agente.nazione = [results stringForColumn:@"nazione"];
        agente.telefono = [results stringForColumn:@"telefono"];
        agente.cellulare = [results stringForColumn:@"cellulare"];
        agente.partitaiva = [results stringForColumn:@"partitaiva"];
        agente.codicefiscale = [results stringForColumn:@"codicefiscale"];
        agente.provincia = [results stringForColumn:@"provincia"];
        agente.email = [results stringForColumn:@"email"];
        agente.utente = [results stringForColumn:@"utente"];
        agente.password = [results stringForColumn:@"password"];
        agente.sitoweb = [results stringForColumn:@"sitoweb"];
        [agenti addObject:agente];
    }
    
    [db close];
    
    return agenti;
    
}

-(Agente *) getAgentexCodice:(NSString *)codage
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM agenti where codage=? ", codage];
    
    Agente *agente = [[Agente alloc] init];
    while([results next])
    {
        agente.id = [results intForColumn:@"id"];
        agente.codage = [results stringForColumn:@"codage"];
        agente.descrizione = [results stringForColumn:@"descrizione"];
        agente.indirizzo = [results stringForColumn:@"indirizzo"];
        agente.cap = [results stringForColumn:@"cap"];
        agente.citta = [results stringForColumn:@"citta"];
        agente.nazione = [results stringForColumn:@"nazione"];
        agente.telefono = [results stringForColumn:@"telefono"];
        agente.cellulare = [results stringForColumn:@"cellulare"];
        agente.partitaiva = [results stringForColumn:@"partitaiva"];
        agente.codicefiscale = [results stringForColumn:@"codicefiscale"];
        agente.provincia = [results stringForColumn:@"provincia"];
        agente.email = [results stringForColumn:@"email"];
        agente.utente = [results stringForColumn:@"utente"];
        agente.password = [results stringForColumn:@"password"];
        agente.sitoweb = [results stringForColumn:@"sitoweb"];
        break;
    }
    
    [db close];
    
    return agente;
}

-(BOOL) updateAgente:(Agente *)agente
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE agenti SET codage = ?, descrizione = ?, indirizzo = ?, cap = ?, citta = ?, nazione = ?, telefono = ?, cellulare = ?, partitaiva = ?, codicefiscale = ?, provincia = ?, email = ?, utente = ?, password = ?, sitoweb = ? where id = ? ;", agente.codage, agente.descrizione, agente.indirizzo, agente.cap, agente.citta, agente.nazione, agente.telefono, agente.cellulare, agente.partitaiva, agente.codicefiscale, agente.provincia, agente.email, agente.utente, agente.password, agente.sitoweb, [NSNumber numberWithInt:agente.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertAgente:(Agente *)agente
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO agenti (codage, descrizione, indirizzo, cap, citta, nazione, telefono, cellulare, partitaiva, codicefiscale, provincia, email, utente, password, sitoweb) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);",
                    agente.codage, agente.descrizione, agente.indirizzo, agente.cap, agente.citta, agente.nazione, agente.telefono, agente.cellulare, agente.partitaiva, agente.codicefiscale, agente.provincia, agente.email, agente.utente, agente.password, agente.sitoweb ];
    
    [db close];
    
    return success;
}

-(BOOL) removeAgente:(Agente *)agente
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM agenti where id = ? ;", [NSNumber numberWithInt:agente.id]];
    
    [db close];
    
    return success;
}


// TRASPORTI
-(NSMutableArray *) getTrasporto;
{
    NSMutableArray *trasporti = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM trasporto ORDER BY codtra"];
    
    while([results next])
    {
        Trasporto *trasporto = [[Trasporto alloc] init];
        trasporto.id = [results intForColumn:@"id"];
        trasporto.codtra = [results stringForColumn:@"codtra"];
        trasporto.descrizione = [results stringForColumn:@"descrizione"];
        trasporto.indirizzo = [results stringForColumn:@"indirizzo"];
        trasporto.cap = [results stringForColumn:@"cap"];
        trasporto.citta = [results stringForColumn:@"citta"];
        trasporto.provincia = [results stringForColumn:@"provincia"];
        trasporto.nazione = [results stringForColumn:@"nazione"];
        trasporto.telefono = [results stringForColumn:@"telefono"];
        [trasporti addObject:trasporto];
    }
    
    [db close];
    
    return trasporti;
    
}

-(Trasporto *) getTrasportoxCodice:(NSString *)codtra
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM trasporto where codtra=? ", codtra];
    
    Trasporto *trasporto = [[Trasporto alloc] init];
    while([results next])
    {
        trasporto.id = [results intForColumn:@"id"];
        trasporto.codtra = [results stringForColumn:@"codtra"];
        trasporto.descrizione = [results stringForColumn:@"descrizione"];
        trasporto.indirizzo = [results stringForColumn:@"indirizzo"];
        trasporto.cap = [results stringForColumn:@"cap"];
        trasporto.citta = [results stringForColumn:@"citta"];
        trasporto.provincia = [results stringForColumn:@"provincia"];
        trasporto.nazione = [results stringForColumn:@"nazione"];
        trasporto.telefono = [results stringForColumn:@"telefono"];
        break;
    }
    
    [db close];
    
    return trasporto;
}

-(BOOL) updateTrasporto:(Trasporto *)trasporto
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE trasporto SET codtra = ?, descrizione = ?, indirizzo = ?, cap = ?, citta = ?, provincia = ?, nazione = ?, telefono = ? where id = ? ;", trasporto.codtra, trasporto.descrizione, trasporto.indirizzo, trasporto.cap, trasporto.citta, trasporto.provincia, trasporto.nazione, trasporto.telefono, [NSNumber numberWithInt:trasporto.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertTrasporto:(Trasporto *)trasporto
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO trasporto (codtra, descrizione, indirizzo, cap, citta, provincia, nazione, telefono) VALUES (?,?,?,?,?,?,?,?);",
                    trasporto.codtra, trasporto.descrizione, trasporto.indirizzo, trasporto.cap, trasporto.citta, trasporto.provincia, trasporto.nazione, trasporto.telefono ];
    
    [db close];
    
    return success;
}

-(BOOL) removeTrasporto:(Trasporto *)trasporto
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM trasporto where id = ? ;", [NSNumber numberWithInt:trasporto.id]];
    
    [db close];
    
    return success;
}


// BANCHE
-(NSMutableArray *) getBanche;
{
    NSMutableArray *banche = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM banche ORDER BY codban"];
    
    while([results next])
    {
        Banca *banca = [[Banca alloc] init];
        banca.id = [results intForColumn:@"id"];
        banca.codban = [results stringForColumn:@"codban"];
        banca.descrizione = [results stringForColumn:@"descrizione"];
        banca.indirizzo = [results stringForColumn:@"indirizzo"];
        banca.cap = [results stringForColumn:@"cap"];
        banca.citta = [results stringForColumn:@"citta"];
        banca.provincia = [results stringForColumn:@"provincia"];
        banca.nazione = [results stringForColumn:@"nazione"];
        banca.telefono = [results stringForColumn:@"telefono"];
        banca.abi = [results stringForColumn:@"abi"];
        banca.cab = [results stringForColumn:@"cab"];
        banca.iban = [results stringForColumn:@"iban"];
        banca.note = [results stringForColumn:@"note"];
        [banche addObject:banca];
    }
    
    [db close];
    
    return banche;
    
}

-(Banca *) getBancaxCodice:(NSString *)codban
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM banche where codban=? ", codban];
    
    Banca *banca = [[Banca alloc] init];
    while([results next])
    {
        banca.id = [results intForColumn:@"id"];
        banca.codban = [results stringForColumn:@"codban"];
        banca.descrizione = [results stringForColumn:@"descrizione"];
        banca.indirizzo = [results stringForColumn:@"indirizzo"];
        banca.cap = [results stringForColumn:@"cap"];
        banca.citta = [results stringForColumn:@"citta"];
        banca.provincia = [results stringForColumn:@"provincia"];
        banca.nazione = [results stringForColumn:@"nazione"];
        banca.telefono = [results stringForColumn:@"telefono"];
        banca.abi = [results stringForColumn:@"abi"];
        banca.cab = [results stringForColumn:@"cab"];
        banca.iban = [results stringForColumn:@"iban"];
        banca.note = [results stringForColumn:@"note"];
        break;
    }
    
    [db close];
    
    return banca;
}

-(BOOL) updateBanca:(Banca *)banca
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE banche SET codban = ?, descrizione = ?, indirizzo = ?, cap = ?, citta = ?, provincia = ?, nazione = ?, telefono = ?, abi = ?, cab = ?, iban = ?, note = ? where id = ? ;", banca.codban, banca.descrizione, banca.indirizzo, banca.cap, banca.citta, banca.provincia, banca.nazione, banca.telefono, banca.abi, banca.cab, banca.iban, banca.note ,[NSNumber numberWithInt:banca.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertBanca:(Banca *)banca
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO banche (codban, descrizione, indirizzo, cap, citta, provincia, nazione, telefono, abi, cab, iban, note) VALUES (?,?,?,?,?,?,?,?,?,?,?,?);",
                    banca.codban, banca.descrizione, banca.indirizzo, banca.cap, banca.citta, banca.provincia, banca.nazione, banca.telefono, banca.abi, banca.cab, banca.iban, banca.note ];
    
    [db close];
    
    return success;
}

-(BOOL) removeBanca:(Banca *)banca
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM banche where id = ? ;", [NSNumber numberWithInt:banca.id]];
    
    [db close];
    
    return success;
}


// CONDIZIONI DI PAGAMENTO
-(NSMutableArray *) getCondizioniPagamento
{
    NSMutableArray *pagamenti = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM pagamento ORDER BY codpag"];
    
    while([results next])
    {
        Pagamento *pagamento = [[Pagamento alloc] init];
        pagamento.id = [results intForColumn:@"id"];
        pagamento.codpag = [results stringForColumn:@"codpag"];
        pagamento.descrizione = [results stringForColumn:@"descrizione"];
        pagamento.avvenuto = [results boolForColumn:@"avvenuto"];
        [pagamenti addObject:pagamento];
    }
    
    [db close];
    
    return pagamenti;
    
}

-(Pagamento *) getCondizionePagamentoxCodice:(NSString *)codpag
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM pagamento where codpag=? ", codpag];
    
    Pagamento *pagamento = [[Pagamento alloc] init];
    while([results next])
    {
        pagamento.id = [results intForColumn:@"id"];
        pagamento.codpag = [results stringForColumn:@"codpag"];
        pagamento.descrizione = [results stringForColumn:@"descrizione"];
        pagamento.avvenuto = [results boolForColumn:@"avvenuto"];
        break;
    }
    
    [db close];
    
    return pagamento;
}

-(BOOL) updateCondizionePagamento:(Pagamento *)pagamento
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE pagamento SET codpag = ?, descrizione = ?, avvenuto = ? where id = ? ;", pagamento.codpag, pagamento.descrizione, [NSNumber numberWithBool:pagamento.avvenuto], [NSNumber numberWithInt:pagamento.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertCondizionePagamento:(Pagamento *)pagamento
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO pagamento (codpag, descrizione, avvenuto) VALUES (?,?,?);",
                    pagamento.codpag, pagamento.descrizione, [NSNumber numberWithBool:pagamento.avvenuto]];
    
    [db close];
    
    return success;
}

-(BOOL) removeCondizionePagamento:(Pagamento *)pagamento
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM pagamento where id = ? ;", [NSNumber numberWithInt:pagamento.id]];
    
    [db close];
    
    return success;
}


// TESTA


-(NSMutableArray *) getTesta:(NSString *)filtro;
{
    NSMutableArray *movimentitesta = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM testa ORDER BY testa.dataora"];
    
    while([results next])
    {
        Testa *testa = [[Testa alloc] init];
        
        testa.id = [results intForColumn:@"id"];
        testa.dataora = [results dateForColumn:@"dataora"];
        testa.codcli = [results stringForColumn:@"codcli"];
        testa.coddep = [results stringForColumn:@"coddep"];
        testa.imponibile = [NSNumber numberWithDouble:[results doubleForColumn:@"imponibile" ]];
        testa.iva = [NSNumber numberWithDouble:[results doubleForColumn:@"iva" ]];
        testa.totaleivato = [NSNumber numberWithDouble:[results doubleForColumn:@"totaleivato" ]];
        testa.chiuso = [results boolForColumn:@"chiuso"];
        testa.nota = [results stringForColumn:@"nota"];
        testa.codtipmov = [results stringForColumn:@"codtipmov"];
        testa.idcliente = [results intForColumn:@"idcliente"];
        
        
        [movimentitesta addObject:testa];
        
    }
    
    [db close];
    
    return movimentitesta;
    
}

-(NSMutableArray *) getTestaForVisualizzazione:(NSString *)filtro;
{
    NSMutableArray *movimentitesta = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"select testa.*, clienti.ragionesociale, tipimov.descrizione from testa left join clienti on testa.idcliente = clienti.id left join tipimov on testa.codtipmov = tipimov.codmov ORDER BY testa.dataora "];
    
    while([results next])
    {
        TestaVisualizzazione *testa = [[TestaVisualizzazione alloc] init];
        
        testa.id = [results intForColumn:@"id"];
        testa.dataora = [results dateForColumn:@"dataora"];
        testa.codcli = [results stringForColumn:@"codcli"];
        testa.coddep = [results stringForColumn:@"coddep"];
        testa.imponibile = [NSNumber numberWithDouble:[results doubleForColumn:@"imponibile" ]];
        testa.iva = [NSNumber numberWithDouble:[results doubleForColumn:@"iva" ]];
        testa.totaleivato = [NSNumber numberWithDouble:[results doubleForColumn:@"totaleivato" ]];
        testa.chiuso = [results boolForColumn:@"chiuso"];
        testa.nota = [results stringForColumn:@"nota"];
        testa.codtipmov = [results stringForColumn:@"codtipmov"];
        testa.idcliente = [results intForColumn:@"idcliente"];
        testa.ragionesociale = [results stringForColumn:@"ragionesociale"];
        testa.descmov = [results stringForColumn:@"descrizione"];
        
        [movimentitesta addObject:testa];
        
    }
    
    [db close];
    
    return movimentitesta;
    
}


-(Testa *) getTestaxId:(int)idtesta;
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM testa where id=? ", [NSNumber numberWithInt:idtesta]];

    Testa *testa = [[Testa alloc] init];
    while([results next])
    {
       
        testa.id = [results intForColumn:@"id"];
        testa.dataora = [results dateForColumn:@"dataora"];
        testa.codtipmov = [results stringForColumn:@"codtipmov"];
        testa.codcli = [results stringForColumn:@"codcli"];
        testa.idcliente = [results intForColumn:@"idcliente"];
        testa.coddep = [results stringForColumn:@"coddep"];
        testa.imponibile = [NSNumber numberWithDouble:[results doubleForColumn:@"imponibile" ]];
        testa.iva = [NSNumber numberWithDouble:[results doubleForColumn:@"iva" ]];
        testa.totaleivato = [NSNumber numberWithDouble:[results doubleForColumn:@"totaleivato" ]];
        testa.chiuso = [results boolForColumn:@"chiuso"];
        testa.nota = [results stringForColumn:@"nota"];
        break;
        
    }
    
    [db close];
    
    // righe documento
    // dati cliente
    testa.righeDocumento = [self getDettaglio:testa.id];
    testa.datiCliente = [self getClienteXid:testa.idcliente];
    
    return testa;
    
}



-(BOOL) updateTesta:(Testa *)testa
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE testa SET dataora = ?, codtipmov = ?, codcli = ?, coddep = ?, imponibile = ?, iva = ?, totaleivato = ?, chiuso = ?, nota = ?, idcliente = ? where id = ? ;", testa.dataora, testa.codtipmov, testa.codcli, testa.coddep, testa.imponibile, testa.iva, testa.totaleivato, testa.chiuso, testa.nota, [NSNumber numberWithInt:testa.idcliente], [NSNumber numberWithInt:testa.id]];
    
    [db close];
    
    if (success){
        success = [self removeDettaglio:testa.id];
        if (success){
            for (int i=0; i<testa.righeDocumento.count; i++) {
                RigaDettaglio *riga = testa.righeDocumento[i];
                riga.idtesta = testa.id;
            }
            success = [self insertDettaglio:testa.righeDocumento];
        }
    }
    
    //[self removeDettaglio:0];
    
    return success;
}

-(BOOL) insertTesta:(Testa *)testa
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO testa (dataora, codtipmov, codcli, idcliente, coddep, imponibile, iva, totaleivato, chiuso, nota) VALUES (?,?,?,?,?,?,?,?,?,?);",
                    testa.dataora, testa.codtipmov, testa.codcli, [NSNumber numberWithInt:testa.idcliente], testa.coddep, testa.imponibile, testa.iva, testa.totaleivato, testa.chiuso, testa.nota];
    
    int lastId = 0;
    if (success){
        lastId=(int)[db lastInsertRowId];
    }
    
    [db close];
    
    if (success){
        for (int i=0; i<testa.righeDocumento.count; i++) {
            RigaDettaglio *riga = testa.righeDocumento[i];
            riga.idtesta = lastId;
        }
        success = [self insertDettaglio:testa.righeDocumento];
    }

    
    return success;
}

-(BOOL) removeTesta:(Testa *)testa
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM testa where id = ? ;", [NSNumber numberWithInt:testa.id]];
    
    [db close];
    
    BOOL successTotale = success;

    success = [self removeDettaglio:testa.id];
    successTotale = (successTotale  && success ? YES : NO);
    
    
    return successTotale;
}


// DETTAGLIO


-(NSMutableArray *) getDettaglio:(int )idtesta;
{
    NSMutableArray *dettaglio = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM dettaglio where idtesta=? ORDER BY dettaglio.id", [NSNumber numberWithInt:idtesta]];
    
    while([results next])
    {
        RigaDettaglio *rigaDettaglio = [[RigaDettaglio alloc] init];
        
        rigaDettaglio.id = [results intForColumn:@"id"];
        rigaDettaglio.idtesta = [results intForColumn:@"idtesta"]; // che deve essere uguale a idtesta del parametro!
        rigaDettaglio.codart = [results stringForColumn:@"codart"];
        rigaDettaglio.descrizione = [results stringForColumn:@"descrizione"];
        rigaDettaglio.quantita = [NSNumber numberWithDouble:[results doubleForColumn:@"quantita" ]];
        rigaDettaglio.prezzo = [NSNumber numberWithDouble:[results doubleForColumn:@"prezzo" ]];
        rigaDettaglio.sc1 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc1" ]];
        rigaDettaglio.sc2 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc2" ]];
        rigaDettaglio.sc3 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc3" ]];
        rigaDettaglio.sc4 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc4" ]];
        rigaDettaglio.totimponibile = [NSNumber numberWithDouble:[results doubleForColumn:@"totimponibile" ]];
        rigaDettaglio.totiva = [NSNumber numberWithDouble:[results doubleForColumn:@"totiva" ]];
        rigaDettaglio.totaleivato = [NSNumber numberWithDouble:[results doubleForColumn:@"totaleivato" ]];
        rigaDettaglio.codali = [results stringForColumn:@"codali"];
        rigaDettaglio.unmisura = [results stringForColumn:@"unmisura"];
        rigaDettaglio.costoimponibile = [NSNumber numberWithDouble:[results doubleForColumn:@"costoimponibile" ]];
        [dettaglio addObject:rigaDettaglio];
        
    }
    
    [db close];
    
    return dettaglio
;
    
}

-(BOOL) insertDettaglio:(NSMutableArray *)dettaglio
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL successTotale = YES;
    
    for (int i=0; i<dettaglio.count; i++) {
        RigaDettaglio *rigaDettaglio = [[RigaDettaglio alloc] init];
        rigaDettaglio = [dettaglio objectAtIndex:i];
        
        BOOL success = [db executeUpdate:@"INSERT INTO dettaglio (idtesta, codart, descrizione, quantita, prezzo, sc1, sc2, sc3, sc4, totimponibile, totiva, totaleivato, codali, unmisura, costoimponibile) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);",
                        [NSNumber numberWithInt:rigaDettaglio.idtesta], rigaDettaglio.codart, rigaDettaglio.descrizione, rigaDettaglio.quantita, rigaDettaglio.prezzo, rigaDettaglio.sc1, rigaDettaglio.sc2, rigaDettaglio.sc3, rigaDettaglio.sc4, rigaDettaglio.totimponibile, rigaDettaglio.totiva, rigaDettaglio.totaleivato, rigaDettaglio.codali, rigaDettaglio.unmisura, rigaDettaglio.costoimponibile];

        successTotale = (successTotale  && success ? YES : NO);
        
    }
    
    
    
    [db close];
    
    return successTotale;
}


-(BOOL) removeDettaglio:(int )idtesta
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    // TODO magari prima di cancellare dobbiamo aggiornare giacenze se necessario
    
    BOOL success = [db executeUpdate:@"DELETE FROM dettaglio where idtesta = ? ;", [NSNumber numberWithInt:idtesta]];
    
    [db close];
    
    return success;
}






// CLIENTI

-(NSMutableArray *)getClienti:(NSString *)filtro :(NSDate *)ultimamodifica;
{
    NSMutableArray *clienti = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    NSString *testoFiltro = @"";
    if (filtro.length!=0){
        testoFiltro = [NSString stringWithFormat:@" WHERE ragionesociale LIKE '%%%@%%' ", filtro];
    }
    
    if (ultimamodifica != nil){
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
        [formatter setLocale:[NSLocale currentLocale]];
        if (testoFiltro.length>0){
            testoFiltro = [NSString stringWithFormat:@" %@ AND ultimamodifica >= %@ ", testoFiltro, [formatter stringFromDate:ultimamodifica]];
        } else {
            testoFiltro = [NSString stringWithFormat:@" WHERE ultimamodifica >= %@ ", [formatter stringFromDate:ultimamodifica]];
        }

    }
    
    
    NSString *testoQuery = [NSString stringWithFormat:@"SELECT * FROM clienti %@ ORDER BY UPPER(ragionesociale)", testoFiltro];
    
    FMResultSet *results = [db executeQuery:testoQuery];
    
    while([results next])
    {
        Cliente *cliente = [[Cliente alloc] init];
        
        cliente.idcliente = [results intForColumn:@"id"];
        cliente.codice = [results stringForColumn:@"codice"];
        cliente.ragionesociale = [results stringForColumn:@"ragionesociale"];
        cliente.indirizzo = [results stringForColumn:@"indirizzo"];
        cliente.cap = [results stringForColumn:@"cap"];
        cliente.citta = [results stringForColumn:@"citta"];
        cliente.provincia = [results stringForColumn:@"provincia"];
        cliente.nazione = [results stringForColumn:@"nazione"];
        cliente.telefono = [results stringForColumn:@"telefono"];
        cliente.cellulare = [results stringForColumn:@"cellulare"];
        cliente.fax = [results stringForColumn:@"fax"];
        cliente.email = [results stringForColumn:@"email"];
        cliente.sitoweb = [results stringForColumn:@"sitoweb"];
        cliente.partitaiva = [results stringForColumn:@"partitaiva"];
        cliente.codicefiscale = [results stringForColumn:@"codicefiscale"];
        cliente.sc1 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc1" ]];
        cliente.sc2 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc2" ]];
        cliente.sc3 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc3" ]];
        cliente.sc4 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc4" ]];
        cliente.nota = [results stringForColumn:@"nota"];
        cliente.codlistino = [results stringForColumn:@"codlistino"];
        cliente.codagente = [results stringForColumn:@"codagente"];
        cliente.codtrasporto = [results stringForColumn:@"codtrasporto"];
        cliente.codpagamento = [results stringForColumn:@"codpagamento"];
        cliente.codbanca = [results stringForColumn:@"codbanca"];
        cliente.codesenzione = [results stringForColumn:@"codesenzione"];
        cliente.ultimamodifica = [results dateForColumn:@"ultimamodifica"];
        
        
        [clienti addObject:cliente];
        
    }
    
    [db close];
    
    return clienti;
    
}



-(Cliente *)getClienteXid:(int )idCliente;
{
    Cliente *cliente = [[Cliente alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM clienti WHERE id = ? ", [NSNumber numberWithInt:idCliente]];
    
    while([results next])
    {
        cliente.idcliente = [results intForColumn:@"id"];
        cliente.codice = [results stringForColumn:@"codice"];
        cliente.ragionesociale = [results stringForColumn:@"ragionesociale"];
        cliente.indirizzo = [results stringForColumn:@"indirizzo"];
        cliente.cap = [results stringForColumn:@"cap"];
        cliente.citta = [results stringForColumn:@"citta"];
        cliente.provincia = [results stringForColumn:@"provincia"];
        cliente.nazione = [results stringForColumn:@"nazione"];
        cliente.telefono = [results stringForColumn:@"telefono"];
        cliente.cellulare = [results stringForColumn:@"cellulare"];
        cliente.fax = [results stringForColumn:@"fax"];
        cliente.email = [results stringForColumn:@"email"];
        cliente.sitoweb = [results stringForColumn:@"sitoweb"];
        cliente.partitaiva = [results stringForColumn:@"partitaiva"];
        cliente.codicefiscale = [results stringForColumn:@"codicefiscale"];
        cliente.sc1 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc1" ]];
        cliente.sc2 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc2" ]];
        cliente.sc3 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc3" ]];
        cliente.sc4 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc4" ]];
        cliente.nota = [results stringForColumn:@"nota"];
        cliente.codlistino = [results stringForColumn:@"codlistino"];
        cliente.codagente = [results stringForColumn:@"codagente"];
        cliente.codtrasporto = [results stringForColumn:@"codtrasporto"];
        cliente.codpagamento = [results stringForColumn:@"codpagamento"];
        cliente.codbanca = [results stringForColumn:@"codbanca"];
        cliente.codesenzione = [results stringForColumn:@"codesenzione"];
        cliente.ultimamodifica = [results dateForColumn:@"ultimamodifica"];
        
        break;
        
    }
    
    [db close];
    
    return cliente;
    
}


-(Cliente *)getClienteXCampox:(NSString *)camporicerca :(NSString *)valore;
{
    Cliente *cliente = [[Cliente alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    NSString *query = [NSString stringWithFormat:@"SELECT * FROM clienti WHERE %@ = ? ", camporicerca];
    
    FMResultSet *results = [db executeQuery:query, valore];
    
    while([results next])
    {
        cliente.idcliente = [results intForColumn:@"id"];
        cliente.codice = [results stringForColumn:@"codice"];
        cliente.ragionesociale = [results stringForColumn:@"ragionesociale"];
        cliente.indirizzo = [results stringForColumn:@"indirizzo"];
        cliente.cap = [results stringForColumn:@"cap"];
        cliente.citta = [results stringForColumn:@"citta"];
        cliente.provincia = [results stringForColumn:@"provincia"];
        cliente.nazione = [results stringForColumn:@"nazione"];
        cliente.telefono = [results stringForColumn:@"telefono"];
        cliente.cellulare = [results stringForColumn:@"cellulare"];
        cliente.fax = [results stringForColumn:@"fax"];
        cliente.email = [results stringForColumn:@"email"];
        cliente.sitoweb = [results stringForColumn:@"sitoweb"];
        cliente.partitaiva = [results stringForColumn:@"partitaiva"];
        cliente.codicefiscale = [results stringForColumn:@"codicefiscale"];
        cliente.sc1 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc1" ]];
        cliente.sc2 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc2" ]];
        cliente.sc3 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc3" ]];
        cliente.sc4 = [NSNumber numberWithDouble:[results doubleForColumn:@"sc4" ]];
        cliente.nota = [results stringForColumn:@"nota"];
        cliente.codlistino = [results stringForColumn:@"codlistino"];
        cliente.codagente = [results stringForColumn:@"codagente"];
        cliente.codtrasporto = [results stringForColumn:@"codtrasporto"];
        cliente.codpagamento = [results stringForColumn:@"codpagamento"];
        cliente.codbanca = [results stringForColumn:@"codbanca"];
        cliente.codesenzione = [results stringForColumn:@"codesenzione"];
        cliente.ultimamodifica = [results dateForColumn:@"ultimamodifica"];
        
        break;
        
    }
    
    [db close];
    
    return cliente;
    
}




-(BOOL) updateCliente:(Cliente *)cliente
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE clienti SET codice = ?, ragionesociale = ?, indirizzo = ?, cap = ?, citta = ?, provincia = ?, nazione = ?, telefono = ?, cellulare = ?, fax = ?, email = ?, sitoweb = ?, partitaiva = ?, codicefiscale = ?, codlistino = ?, codagente = ?, codtrasporto = ?, codpagamento = ?, codbanca = ?, codesenzione = ?, nota = ?, sc1 = ?, sc2 = ?, sc3 = ?, sc4 = ?, ultimamodifica = ? where id = ?", cliente.codice, cliente.ragionesociale, cliente.indirizzo, cliente.cap, cliente.citta, cliente.provincia, cliente.nazione, cliente.telefono, cliente.cellulare, cliente.fax, cliente.email, cliente.sitoweb, cliente.partitaiva, cliente.codicefiscale, cliente.codlistino, cliente.codagente, cliente.codtrasporto, cliente.codpagamento, cliente.codbanca, cliente.codesenzione, cliente.nota, cliente.sc1, cliente.sc2, cliente.sc3, cliente.sc4, cliente.ultimamodifica, [NSNumber numberWithInt:cliente.idcliente]];
    
    [db close];
    
    return success;
}

-(BOOL) insertCliente:(Cliente *)cliente
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO clienti (codice, ragionesociale, indirizzo, cap, citta, provincia, nazione, telefono, cellulare, fax, email, sitoweb, partitaiva, codicefiscale, codlistino, codagente, codtrasporto, codpagamento, codbanca, codesenzione, nota, sc1, sc2, sc3, sc4, ultimamodifica) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);",
                                      cliente.codice, cliente.ragionesociale, cliente.indirizzo, cliente.cap, cliente.citta, cliente.provincia, cliente.nazione, cliente.telefono, cliente.cellulare, cliente.fax, cliente.email, cliente.sitoweb, cliente.partitaiva, cliente.codicefiscale, cliente.codlistino, cliente.codagente, cliente.codtrasporto, cliente.codpagamento, cliente.codbanca, cliente.codesenzione, cliente.nota, cliente.sc1, cliente.sc2, cliente.sc3, cliente.sc4, cliente.ultimamodifica, nil];
    
    [db close];
    
    return success;
}



// TIPI MOVIMENTO
-(NSMutableArray *) getTipiMov;
{
    NSMutableArray *tipimov = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM tipimov ORDER BY UPPER(codmov)"];
    
    while([results next])
    {
        Tipimov *tipomov = [[Tipimov alloc] init];
        tipomov.id = [results intForColumn:@"id"];
        tipomov.codmov = [results stringForColumn:@"codmov"];
        tipomov.descrizione = [results stringForColumn:@"descrizione"];
        tipomov.tipo = [results intForColumn:@"tipo"];
        tipomov.movimentagiacenza = [results intForColumn:@"movimentagiacenza"];
        tipomov.controparte = [results intForColumn:@"controparte"];
        [tipimov addObject:tipomov];
    }
    
    [db close];
    
    return tipimov;
    
}


-(NSMutableArray *) getTipiMovTV;
{
    NSMutableArray *tipimov = [[NSMutableArray alloc] init];
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM tipimov WHERE tipo=1 and controparte=2 ORDER BY UPPER(codmov)"];
    
    while([results next])
    {
        Tipimov *tipomov = [[Tipimov alloc] init];
        tipomov.id = [results intForColumn:@"id"];
        tipomov.codmov = [results stringForColumn:@"codmov"];
        tipomov.descrizione = [results stringForColumn:@"descrizione"];
        tipomov.tipo = [results intForColumn:@"tipo"];
        tipomov.movimentagiacenza = [results intForColumn:@"movimentagiacenza"];
        tipomov.controparte = [results intForColumn:@"controparte"];
        [tipimov addObject:tipomov];
    }
    
    [db close];
    
    return tipimov;
    
}


-(Tipimov *) getTipiMovxCodice:(NSString *)codmov;
{
    
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    
    FMResultSet *results = [db executeQuery:@"SELECT * FROM tipimov where codmov=? ", codmov];
    
    Tipimov *tipomov = [[Tipimov alloc] init];
    while([results next])
    {
        tipomov.id = [results intForColumn:@"id"];
        tipomov.codmov = [results stringForColumn:@"codmov"];
        tipomov.descrizione = [results stringForColumn:@"descrizione"];
        tipomov.tipo = [results intForColumn:@"tipo"];
        tipomov.movimentagiacenza = [results intForColumn:@"movimentagiacenza"];
        tipomov.controparte = [results intForColumn:@"controparte"];
        break;
    }
    
    [db close];
    
    return tipomov;
}

-(BOOL) updateTipiMov:(Tipimov *)tipomov
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"UPDATE tipimov SET codmov = ?, descrizione = ?, tipo = ?, movimentagiacenza = ?, controparte = ? where id = ? ;", tipomov.codmov, tipomov.descrizione, [NSNumber numberWithInt:tipomov.tipo ], [NSNumber numberWithInt:tipomov.movimentagiacenza ], [NSNumber numberWithInt:tipomov.controparte], [NSNumber numberWithInt:tipomov.id]];
    
    [db close];
    
    return success;
}

-(BOOL) insertTipiMov:(Tipimov *)tipomov;
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"INSERT INTO tipimov (codmov, descrizione, tipo, movimentagiacenza, controparte) VALUES (?,?,?,?,?);",
                    tipomov.codmov, tipomov.descrizione, [NSNumber numberWithInt:tipomov.tipo ], [NSNumber numberWithInt:tipomov.movimentagiacenza ], [NSNumber numberWithInt:tipomov.controparte]];
    
    [db close];
    
    return success;
}

-(BOOL) removeTipiMov:(Tipimov *)tipomov
{
    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    
    [db open];
    
    BOOL success = [db executeUpdate:@"DELETE FROM tipimov where id = ? ;", [NSNumber numberWithInt:tipomov.id]];
    
    [db close];
    
    return success;
}



@end